[レポート] AWS AppSyncでセキュアなGraphQLを構築する #NTA308 #AWSreInvent
こんにちは、AWS事業本部の荒平(@0Air)です。
AWS re:Invent 2024では、ラスベガスへ現地参加しています!
本エントリでは、参加したBuilder's Sessionの「Build a secure GraphQL with AWS AppSync」について紹介します。
3行まとめ
本記事の内容を要約しました。
- AppSync、GraphQLに興味がある初心者〜中級者の方が対象
- 環境をセキュアにするには、Cognitoを利用します
- リクエストに対し、Cognitoのユーザープールに存在するユーザーであればアクセス許可し、それ以外を不許可とすることでセキュアな環境を構築します
セッション概要
In this session, attendees learn how to use AWS Amplify Studio and AWS AppSync to build a secure and scalable GraphQL API. Start by exploring the benefits of a GraphQL-based architecture and how it can simplify application development. Then dive into a working session where participants create their own GraphQL API, configure authentication and authorization, and deploy it into production in your account.
(訳文)
このセッションでは、AWS Amplify StudioとAWS AppSyncを使用してセキュアでスケーラブルなGraphQL APIを構築する方法を学びます。GraphQLベースのアーキテクチャの利点と、アプリケーション開発を簡素化する方法を理解することから始めます。その後、実際にGraphQL APIを作成し、認証と承認を設定し、各自のアカウントで本番環境にデプロイする実習セッションを行います。
スピーカー
- Victor Feinman, Solutions Architect, AWS
- Renu Yadav, Sr. Solutions Architect, Amazon Web Services
- Sailesh Kadam, Sr. Solution Architect, AWS
- Joshua Morrison, Sr Leader, Solutions Architectur, Amazon Web Services
- Jason Polce, Solutions Architect, AWS
※テーブルごとにスピーカーが異なるのですが、私のテーブルはVictorでした
レベル
- 300 - Advanced
セッション内容
構成のイメージ
このセッションで学べるサービスの構成です。
Snack Exchangeという新しいSaaSの基盤作成を想定したワークショップです。
Appsync+DynamoDBのインフラを整えたあと、Cognitoの認証を追加します。
Snack Databaseは事前に用意されており、データ構造は以下の通りでした。これを参考にワークショップを進めていきます。
{
"user_id": <User ID>,
"user_name": <User First Name>,
"snack_name": <User Favorite Snack>,
"snack_type": <Type of Snack>
}
GraphQL APIを作成する
AppSyncのコンソールから、新規のAPIを作成します。
スキーマは課題内に提供されていたので、これを作成したAPIに設定します。
type Snack {
user_id: ID!
user_name: String!
snack_name: String!
snack_type: String!
}
type Query {
getSnack(user_id: ID!, snack_name: String!): Snack
}
schema {
query: Query
}
データソース・リゾルバ構成
このままでは動作しないので、DynamoDBをデータソースに指定します。
データソースにDynamoDBを指定したら、リゾルバーが構成できるのでこれを設定します。
リゾルバーには、リゾルバーコードを設定する必要があるので、リクエストマッピングを以下の通り設定します。
(ワークショップで提供されました)
/**
* Sends a request to the attached data source
* @param {import('@aws-appsync/utils').Context} ctx the context
* @returns {*} the request
*/
export function request(ctx) {
return {
operation: "GetItem",
key: {
user_id: { S: ctx.args.user_id },
snack_name: { S: ctx.args.snack_name }
}
};
}
/**
* Returns the resolver result
* @param {import('@aws-appsync/utils').Context} ctx the context
* @returns {*} the result
*/
export function response(ctx) {
return ctx.result;
}
APIのテスト
AppSyncコンソールから、サンプルクエリを投げて想定通りのレスポンスを得ました。
とってもお手軽にDynamoDBの内容が取得できて色々応用できそうです。
ただ、このままだとパブリックに公開され、誰でも取得できる状態になってしまうので、制限を掛けていきます。
Cognitoでユーザーを追加
ユーザープールを作成し、そこにサンプル用のユーザーを作成します。
AppSync側で認証を追加します。
「Amazon Cognito ユーザープール」を指定し、追加したいユーザープールのIDを入力して保存します。
スキーマを変更
ユーザー認証のため、前手順で設定したスキーマを変更します。
type Snack {
user_id: ID!
@aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
user_name: String!
@aws_cognito_user_pools(cognito_groups: ["Administrators"])
@aws_api_key
snack_name: String!
@aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
snack_type: String!
@aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
}
type Query {
getSnack(user_id: ID!, snack_name: String!): Snack
@aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
}
schema {
query: Query
}
CognitoユーザーでAPIを実行
Cognitoに追加したユーザーからAPIを実行してみます。
まずは、Cognitoユーザーでログインします。
ログイン状態で正常にレスポンスが返りました!
ログインをせず実行した場合や、このユーザーに許可されていないクエリを実行すると、ちゃんとエラーが返りました!
感想
AppSyncを触ったことがなかったので、個人的に勉強になるワークショップでした。
Cognitoのユーザープールを指定すれば一瞬で認証が実装できるのでとても楽でいいですね。
セッションはREPEATも編成され、どちらも満席のようなので、日本にも上陸するかもしれません。
これからAPIの開発をしたいエンジニアの方にはオススメしたいセッションでした!
このエントリが誰かの助けになれば幸いです。
それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!